package sms;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;

public class muti_io extends JFrame  implements ActionListener {
	//多输入多输出界面形成方法
	JFrame f = new JFrame("请输入学生信息");  //设置输入界面框架JFrame的标题
	JPanel pInput = new JPanel();  //在输入界面上增加一个平板容器JPanel
	JLabel xuehao = new JLabel("学号:");//创建一个标签
	JTextField xuehaoText = new JTextField();  //创建一个文本输入框
	JLabel xueshengxm = new JLabel("学生姓名:");
	JTextField xueshengxmText = new JTextField();
	JLabel yuwen = new JLabel("语文成绩:");
	JTextField yuwenText = new JTextField();
	JLabel shuxue = new JLabel("数学成绩:");
	JTextField shuxueText = new JTextField();
	JLabel jisuanji = new JLabel("计算机成绩:");
	JTextField jisuanjiText = new JTextField();
	JButton b = new JButton("输入完成，下一个学生");
	JButton b1 = new JButton("数学最高分");
	JButton b2 = new JButton("一等奖学金");

	boolean checkedpass = true;
	int n = 10;  //班级实际人数，初始是10人
	Student []  keji;  //定义了班级
	int i = 1;
	public  muti_io(){
		set_n();
		int gap = 1;
		f.setSize(700, 300); //设置输入界面的大小尺寸
		f.setLocation(200, 200); //设置输入界面的位置值
		f.setLayout(null);   //设置输入界面的布局——取消布局管理
		pInput.setBounds(gap, gap, 260, 150);  //设置平板容器JPanel在f上的绝对位置和大小（260宽，100高）
		pInput.setLayout(new GridLayout(5,2,gap,gap));  //设置平板容器JPanel的布局为网格布局——5行2列
		//把上面的组件都添加到平板容器JPanel中去
		pInput.add(xuehao);		pInput.add(xuehaoText);
		pInput.add(xueshengxm);	pInput.add(xueshengxmText);
		pInput.add(yuwen);		pInput.add(yuwenText);
		pInput.add(shuxue);		pInput.add(shuxueText);
		pInput.add(jisuanji);	pInput.add(jisuanjiText);
		b.setBounds(30,200, 200, 30);  //设置按钮的位置和大小
		b1.setBounds(240,200, 200, 30);  //设置按钮的位置和大小
		b2.setBounds(450,200, 200, 30);  //设置按钮的位置和大小
		//把上面的组件都添加到界面框架JFrame中去
		f.add(pInput);		f.add(b); f.add(b1); f.add(b2);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //点击关闭框架JFrame的关闭按钮的时候自动退出
		f.setVisible(true);   //设置框架JFrame可见
		this.setAlwaysOnTop(true);
		b.addActionListener(this);  //为按钮b添加监听被单击的事件
		b1.addActionListener(this);
		b2.addActionListener(this);
	}


	//输入属性值方法
	void set_n(){    //输入班级实际人数
	String s = JOptionPane.showInputDialog("请输入班级实际人数：");
	n = Integer.parseInt(s);
	keji =new Student[n + 1];
	}

	@Override
	public void actionPerformed(ActionEvent e){  //重写单击事件的方法
		if(e.getSource() == b) {
			Student s = new Student();
			checkedpass = true;
			checkEmpty(xuehaoText,"学号");   //验证学号和姓名不能为空
			checkStuNo(xuehaoText,"学号");
			checkEmpty(xueshengxmText,"学生姓名");
			checkNumber(yuwenText,"语文成绩");   //验证成绩必须在合理范围
			checkNumber(shuxueText,"数学成绩");
			checkNumber(jisuanjiText,"计算机成绩");

			s.set_xuehao(Integer.parseInt(xuehaoText.getText()));
			s.set_name(xueshengxmText.getText());
			s.set_yuwen(Double.parseDouble(yuwenText.getText()));
			s.set_shuxue(Double.parseDouble(shuxueText.getText()));
			s.set_jisuanji(Double.parseDouble(jisuanjiText.getText()));

			// 总分，平均分，奖学金等级
			s.set_sum();
			s.set_average();
			s.setScholarshipLevel();

			keji[i]=s;
			i++;
			xuehaoText.setText("");
			xueshengxmText.setText("");
			yuwenText.setText("");
			shuxueText.setText("");
			jisuanjiText.setText("");

			if (i == n) b.setText("显示信息");

			else if(i > n) {
				this.dispose();
				this.hide();
				new b(keji);
			}
		}else if(e.getSource() == b1){

//			System.out.println(i);

			if (i <= n){
				JOptionPane.showMessageDialog(null,"输入未完成，请继续输入");
			}else {
				// 数学最高分的学生

				// 用来保存数学最高分学生信息，如果有多个最高分则都显示
				List<Student> studentList = new ArrayList<>();

				// 先找出数学成绩最高的学生
				Student max = keji[1];
				for (int i = 1; i < keji.length; i++){
					if (keji[i].get_shuxue() >= max.get_shuxue()){
						max = keji[i];
					}
				}

				// 再找出所有数学成绩最高的学生
				for (int i = 1; i < keji.length; i++){
					if (keji[i].get_shuxue() == max.get_shuxue()){
						studentList.add(keji[i]);
					}
				}

				Student[] s = new Student[studentList.size()];
//				s[0] = max;
				studentList.toArray(s);

				new b(s, "数学最高分学生信息");

			}



		}else if(e.getSource() ==  b2){
			if (i <= n){
				JOptionPane.showMessageDialog(null,"输入未完成，请继续输入");
			}else{
				// 用来保存获取一等奖学金的学生信息
				List<Student> studentList = new ArrayList<>();
				for (int i = 1; i < keji.length; i++){
					if (keji[i].getScholarshipLevel() == 1){
						studentList.add(keji[i]);
					}
				}
				Student[] students = new Student[studentList.size()];
				studentList.toArray(students);

				new b(students, "获得一等奖学金的学生信息");
			}
		}
	}


	//检验是否为空
	private void checkEmpty(JTextField tf, String msg){
		if(!checkedpass)  			return;
		String value = tf.getText();
		if(value.length()==0){
			JOptionPane.showMessageDialog(tf, msg + " 不能为空");
			tf.grabFocus();
			checkedpass = false;
		}
	}

	//检验输入成绩必须是整数
	private void checkNumber(JTextField tf, String msg){
		if(!checkedpass) return;
		String value = tf.getText();
		try {
			Integer.parseInt(value);
		} catch (NumberFormatException e) {
			JOptionPane.showMessageDialog(tf, msg + " 必须是整数");
			tf.grabFocus();
			checkedpass = false;
		}
		if(Integer.parseInt(value)>100||Integer.parseInt(value)<0){
			JOptionPane.showMessageDialog(tf, msg + " 成绩必须在0~100之间");
			tf.grabFocus();
			checkedpass = false;
		}
	}


	// 检验输入学号必须是整数
	private void checkStuNo(JTextField tf, String msg){
		if(!checkedpass)  			return;
		String value = tf.getText();
		try {
			Integer.parseInt(value);
		} catch (NumberFormatException e) {
			JOptionPane.showMessageDialog(tf, msg + " 必须是整数");
			tf.grabFocus();
			checkedpass = false;
		}
	}
}
